{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "ffd372b9-c267-400b-a2d9-1c9b7640145c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-10-28T14:16:00.465535Z",
     "iopub.status.busy": "2024-10-28T14:16:00.464873Z",
     "iopub.status.idle": "2024-10-28T14:16:00.487709Z",
     "shell.execute_reply": "2024-10-28T14:16:00.485365Z",
     "shell.execute_reply.started": "2024-10-28T14:16:00.465490Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import networkx as nx\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib import animation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "0c0a9a18-1f9b-44f2-9f72-704857d60660",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-10-28T14:16:17.043878Z",
     "iopub.status.busy": "2024-10-28T14:16:17.043506Z",
     "iopub.status.idle": "2024-10-28T14:16:17.054785Z",
     "shell.execute_reply": "2024-10-28T14:16:17.052449Z",
     "shell.execute_reply.started": "2024-10-28T14:16:17.043852Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<img src=\"./imgs/gnn_layers.png\" width=\"500\"/>"
      ],
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.display import Image\n",
    "from IPython.display import HTML\n",
    "Image(url='./imgs/gnn_layers.png', width=500)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "507c7d3d-b3e5-4b6a-ae98-3c6dc42d0dbf",
   "metadata": {},
   "source": [
    "### message passing"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bf2f6d23-141a-48cc-abca-3c8370fae9b8",
   "metadata": {},
   "source": [
    "- message passing 建立在邻接矩阵上；\n",
    "- 无向图的邻接矩阵是对称矩阵；\n",
    "- Message Passing as Matrix Multiplication：邻接矩阵右乘一个 node features matrix 的结果\n",
    "    - 当前node的表示，由其 connected neighbor nodes sum 表示；\n",
    "- message passing\n",
    "    - messages are the feature vectors and the aggregation function is the sum/average；\n",
    "    - Scale neighborhood sum by neighborhood size (i.e. average values)\n",
    "    $$\n",
    "    D^{-1}A=A_{avg}\n",
    "    $$\n",
    "    - $D^{-1}$：degree matrix 的逆，用于求平均；\n",
    "- Normalized Adjacency Matrix\n",
    "    - $\\tilde A=A+I$\n",
    "    - $\\tilde D^{-1/2}\\tilde A\\tilde D^{-1/2}$, $\\hat A_{ij}=\\frac{1}{\\sqrt{\\tilde d_i\\tilde d_j}}\\tilde A_{ij}$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "948c0766-b6fe-4e55-a455-4daa895c7552",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-10-28T14:02:12.976205Z",
     "iopub.status.busy": "2024-10-28T14:02:12.975708Z",
     "iopub.status.idle": "2024-10-28T14:02:12.992205Z",
     "shell.execute_reply": "2024-10-28T14:02:12.990498Z",
     "shell.execute_reply.started": "2024-10-28T14:02:12.976174Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 1, 0, 0, 0],\n",
       "       [1, 0, 1, 0, 0],\n",
       "       [0, 1, 0, 1, 1],\n",
       "       [0, 0, 1, 0, 0],\n",
       "       [0, 0, 1, 0, 0]])"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A = np.array(\n",
    "    [[0, 1, 0, 0, 0], \n",
    "     [1, 0, 1, 0, 0], \n",
    "     [0, 1, 0, 1, 1], \n",
    "     [0, 0, 1, 0, 0], \n",
    "     [0, 0, 1, 0, 0]]\n",
    ")\n",
    "A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "1cd513bf-64f1-4cb3-94da-4da8bbb3094c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-10-28T14:12:41.733406Z",
     "iopub.status.busy": "2024-10-28T14:12:41.732737Z",
     "iopub.status.idle": "2024-10-28T14:12:41.745625Z",
     "shell.execute_reply": "2024-10-28T14:12:41.743243Z",
     "shell.execute_reply.started": "2024-10-28T14:12:41.733357Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g = nx.from_numpy_array(A)\n",
    "g.number_of_nodes()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "b88e4225-c863-4dc9-b739-ec76826bc0e4",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-10-28T14:12:54.613284Z",
     "iopub.status.busy": "2024-10-28T14:12:54.612901Z",
     "iopub.status.idle": "2024-10-28T14:12:54.815701Z",
     "shell.execute_reply": "2024-10-28T14:12:54.814209Z",
     "shell.execute_reply.started": "2024-10-28T14:12:54.613260Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1000x1000 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "node_labels = {i: i+1 for i in range(g.number_of_nodes())}\n",
    "pos = nx.planar_layout(g)\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(10,10))\n",
    "nx.draw(\n",
    "    g, pos, with_labels=True, \n",
    "    labels=node_labels, \n",
    "    node_color='#83C167', \n",
    "    ax=ax, edge_color='gray', node_size=1500, font_size=30, font_family='serif'\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "31000eeb-3aea-422a-8a00-a683ae41b154",
   "metadata": {},
   "source": [
    "#### Message Passing as Matrix Multiplication"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "5bcc8a1b-ee49-474a-b9aa-d278a38b1075",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-10-28T14:03:04.772312Z",
     "iopub.status.busy": "2024-10-28T14:03:04.771634Z",
     "iopub.status.idle": "2024-10-28T14:03:04.784578Z",
     "shell.execute_reply": "2024-10-28T14:03:04.782436Z",
     "shell.execute_reply.started": "2024-10-28T14:03:04.772262Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 2],\n",
       "       [ 4],\n",
       "       [11],\n",
       "       [ 3],\n",
       "       [ 3]])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "H = A @ feats\n",
    "H"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "f2e799a6-4363-45f5-bd24-1476ddd1f1ee",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-10-28T14:02:39.016819Z",
     "iopub.status.busy": "2024-10-28T14:02:39.016193Z",
     "iopub.status.idle": "2024-10-28T14:02:39.026670Z",
     "shell.execute_reply": "2024-10-28T14:02:39.025329Z",
     "shell.execute_reply.started": "2024-10-28T14:02:39.016774Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1],\n",
       "       [2],\n",
       "       [3],\n",
       "       [4],\n",
       "       [5]])"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "feats = np.arange(A.shape[0]).reshape((-1, 1))+1\n",
    "feats"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6c403464-ab93-41b2-91fd-adc29790df01",
   "metadata": {},
   "source": [
    "#### Scale neighborhood sum by neighborhood size (i.e. average values)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "199693db-3d6a-4238-9a23-32878c847448",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-10-28T14:04:22.582456Z",
     "iopub.status.busy": "2024-10-28T14:04:22.581831Z",
     "iopub.status.idle": "2024-10-28T14:04:22.597852Z",
     "shell.execute_reply": "2024-10-28T14:04:22.595660Z",
     "shell.execute_reply.started": "2024-10-28T14:04:22.582410Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[1., 0., 0., 0., 0.],\n",
       "        [0., 2., 0., 0., 0.],\n",
       "        [0., 0., 3., 0., 0.],\n",
       "        [0., 0., 0., 1., 0.],\n",
       "        [0., 0., 0., 0., 1.]]),\n",
       " array([[1.        , 0.        , 0.        , 0.        , 0.        ],\n",
       "        [0.        , 0.5       , 0.        , 0.        , 0.        ],\n",
       "        [0.        , 0.        , 0.33333333, 0.        , 0.        ],\n",
       "        [0.        , 0.        , 0.        , 1.        , 0.        ],\n",
       "        [0.        , 0.        , 0.        , 0.        , 1.        ]]))"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Scale neighborhood sum by neighborhood size (i.e. average values)\n",
    "D = np.zeros(A.shape)\n",
    "np.fill_diagonal(D, A.sum(axis=0))\n",
    "D_inv = np.linalg.inv(D)\n",
    "D, D_inv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "58d8e45b-6eda-4089-95d3-b2e22681fc92",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-10-28T14:04:52.153226Z",
     "iopub.status.busy": "2024-10-28T14:04:52.152867Z",
     "iopub.status.idle": "2024-10-28T14:04:52.165423Z",
     "shell.execute_reply": "2024-10-28T14:04:52.163012Z",
     "shell.execute_reply.started": "2024-10-28T14:04:52.153201Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[2.        ],\n",
       "       [2.        ],\n",
       "       [3.66666667],\n",
       "       [3.        ],\n",
       "       [3.        ]])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "H_avg = (D_inv @ A) @ feats\n",
    "H_avg"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7dcf91fa-40de-4efd-b904-eefa92b0040d",
   "metadata": {},
   "source": [
    "#### Normalized Adjacency Matrix"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "acee1840-217e-4951-afcd-7bde729ef1af",
   "metadata": {},
   "source": [
    "$$\n",
    "\\begin{split}\n",
    "&\\tilde A=A+I => \\hat A=\\tilde D^{-1/2}\\tilde A\\tilde D^{1/2}\\\\\n",
    "&(\\hat A)_{i,j}=\\frac{1}{\\sqrt{\\tilde d_i\\tilde d_j}}\\tilde A_{i,j}\n",
    "\\end{split}\n",
    "$$\n",
    "\n",
    "- degree matrix：$(D)_{ij}=\\delta_{ij}\\sum_kA_{i,k}$\n",
    "    - $(\\tilde D)_{ij}=\\delta_{ij}\\sum_k\\tilde A_{i,k}$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "fd0c4c2b-d5b6-47c7-b22e-e200a0696ef2",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-10-28T14:06:30.754022Z",
     "iopub.status.busy": "2024-10-28T14:06:30.753384Z",
     "iopub.status.idle": "2024-10-28T14:06:30.768804Z",
     "shell.execute_reply": "2024-10-28T14:06:30.766862Z",
     "shell.execute_reply.started": "2024-10-28T14:06:30.753975Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[0, 1, 0, 0, 0],\n",
       "        [1, 0, 1, 0, 0],\n",
       "        [0, 1, 0, 1, 1],\n",
       "        [0, 0, 1, 0, 0],\n",
       "        [0, 0, 1, 0, 0]]),\n",
       " array([[1., 1., 0., 0., 0.],\n",
       "        [1., 1., 1., 0., 0.],\n",
       "        [0., 1., 1., 1., 1.],\n",
       "        [0., 0., 1., 1., 0.],\n",
       "        [0., 0., 1., 0., 1.]]))"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A_mod = A + np.eye(g.number_of_nodes())\n",
    "A, A_mod"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "c4f067bf-a848-41cc-917a-c1101e1bc8ea",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-10-28T14:11:03.810035Z",
     "iopub.status.busy": "2024-10-28T14:11:03.809366Z",
     "iopub.status.idle": "2024-10-28T14:11:03.828744Z",
     "shell.execute_reply": "2024-10-28T14:11:03.826473Z",
     "shell.execute_reply.started": "2024-10-28T14:11:03.809986Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[2., 0., 0., 0., 0.],\n",
       "        [0., 3., 0., 0., 0.],\n",
       "        [0., 0., 4., 0., 0.],\n",
       "        [0., 0., 0., 2., 0.],\n",
       "        [0., 0., 0., 0., 2.]]),\n",
       " array([[0.70710678, 0.        , 0.        , 0.        , 0.        ],\n",
       "        [0.        , 0.57735027, 0.        , 0.        , 0.        ],\n",
       "        [0.        , 0.        , 0.5       , 0.        , 0.        ],\n",
       "        [0.        , 0.        , 0.        , 0.70710678, 0.        ],\n",
       "        [0.        , 0.        , 0.        , 0.        , 0.70710678]]))"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# D for A_mod:\n",
    "D_mod = np.zeros_like(A_mod)\n",
    "np.fill_diagonal(D_mod, A_mod.sum(axis=1).flatten())\n",
    "\n",
    "from scipy.linalg import sqrtm \n",
    "# Inverse square root of D:\n",
    "D_mod_invroot = np.linalg.inv(sqrtm(D_mod))\n",
    "D_mod, D_mod_invroot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "93fa596c-779a-4d2d-875a-8bed42199168",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-10-28T14:14:30.988753Z",
     "iopub.status.busy": "2024-10-28T14:14:30.988388Z",
     "iopub.status.idle": "2024-10-28T14:14:30.996945Z",
     "shell.execute_reply": "2024-10-28T14:14:30.994640Z",
     "shell.execute_reply.started": "2024-10-28T14:14:30.988726Z"
    }
   },
   "outputs": [],
   "source": [
    "A_hat = D_mod_invroot @ A_mod @ D_mod_invroot"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "16399ca2-3e87-4e1f-abb3-b31834a9e28e",
   "metadata": {},
   "source": [
    "### water drop"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "2b405868-1c3f-47ff-b134-70a8e299b044",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-10-28T14:15:28.178109Z",
     "iopub.status.busy": "2024-10-28T14:15:28.177452Z",
     "iopub.status.idle": "2024-10-28T14:15:28.189329Z",
     "shell.execute_reply": "2024-10-28T14:15:28.186948Z",
     "shell.execute_reply.started": "2024-10-28T14:15:28.178061Z"
    }
   },
   "outputs": [],
   "source": [
    "H = np.zeros((g.number_of_nodes(), 1))\n",
    "H[0, 0] = 1 # the \"water drop\"\n",
    "iters = 10\n",
    "results = [H.flatten()]\n",
    "for i in range(iters):\n",
    "    H = A_hat @ H\n",
    "    results.append(H.flatten())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "8125792f-d26c-4bec-a501-e31a8913fc52",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-10-28T14:15:35.576696Z",
     "iopub.status.busy": "2024-10-28T14:15:35.576031Z",
     "iopub.status.idle": "2024-10-28T14:15:35.589747Z",
     "shell.execute_reply": "2024-10-28T14:15:35.587592Z",
     "shell.execute_reply.started": "2024-10-28T14:15:35.576648Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Initial signal input: [1. 0. 0. 0. 0.]\n",
      "Final signal output after running 10 steps of message-passing:  [0.18381719 0.20791335 0.20436693 0.13626176 0.13626176]\n"
     ]
    }
   ],
   "source": [
    "print(f\"Initial signal input: {results[0]}\")\n",
    "print(f\"Final signal output after running {iters} steps of message-passing:  {results[-1]}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "b28537b6-01ed-4e3e-857e-fbe080890442",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-10-28T14:16:06.179637Z",
     "iopub.status.busy": "2024-10-28T14:16:06.178961Z",
     "iopub.status.idle": "2024-10-28T14:16:06.413664Z",
     "shell.execute_reply": "2024-10-28T14:16:06.411742Z",
     "shell.execute_reply.started": "2024-10-28T14:16:06.179589Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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AHBRXV2d5syZo+nTpys6OloTJ05Ufn4+JQONlpOTI5fLxaoBhBEWDQCAJGnPnj0qLS3V6dOndeuttyo7O5uCAb/xrRqLFy9WXl4eqwYQBvgKAgBhrra2VrNnz9Zrr72muLg4TZw4kUulEBCsGkB4YdEAgDC2e/dulZaW6syZMxo2bJgyMzMpGAiY6OhoZWdna9GiRcrNzVVCQoLpSAACiK8mABCGamtrNWvWLP3pT39SQkKCJk2axKVSCIrs7GxWDSBMsGgAQJjZuXOnZsyYobNnz+q2225TZmamHA6H6VgIE9HR0crJydGCBQuUl5fHqgHYGD+6AoAwcf78ec2cOVN//vOflZycrEmTJikrK4uSgaDLyspSRESEFi5caDoKgABi0QCAMLBjxw7NmDFD586d0+2336709HQKBozxrRrz589XXl6eEhMTTUcCEAAsGgBgYzU1NSotLdUbb7yhpk2b6oknnlBGRgYlA8axagD2x6IBADa1bds2zZw5UzU1NRo5cqQGDx5MwUDIiIqKurhq5Ofns2oANsSiAQA2U1NTo5KSEr355ptq3ry5nnjiCaWlpVEyEHKysrIUGRmpBQsWmI4CIABYNADARrZu3aqZM2eqtrZWo0aNUmpqKgUDIcu3apSVlSk/P19JSUmmIwHwIxYNALCB6upq/f3vf9dbb72llJQUPfHEE1wqBUvIzMxUZGQkZzUAG2LRAACL27x5s2bNmqW6ujqNGTNGAwcOpGDAMqKiopSbm6vPPvuMVQOwGRYNALCoc+fO6b333tPbb7+t1q1b68knn9SgQYMoGbCczMxMRUdHc1YDsBkWDQCwoE2bNmnWrFnyeDy64447NGDAAAoGLCsyMlK5ubn69NNPlZ+fr+TkZNORAPgBiwYAWMjZs2f17rvv6q9//avatWunJ598kkulYAsZGRmsGoDNsGgAgEVs2LBBH3zwgbxer+68807169ePggHbiIyMVF5enj755BPl5+erSZMmpiMBaCQWDQAIcVVVVfrrX/+qd999Vx07dtSTTz6p/v37UzJgO+np6YqJiWHVAGyCRQMAQpTX69X69es1e/ZsORwO3X333erTpw8FA7blWzXmzp2rgoICVg3A4lg0ACAE+VaM9957T126dNGTTz6pvn37UjJge75VY/78+aajAGgkFg0ACCFer1fr1q3T7Nmz5XQ6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YzoOEHZYNABYwvbt2zVjxgzV1NTo1ltvVVpaGgUDwFV5vV698sorio6O1kMPPWQ6DhBWOKMBIKTV1NRozpw5Wr16tbp06aJRo0YpOTnZdCwAFuFbNd5++23t3r1bnTp1Mh0JCBssGgBC1tatWzVz5kydP39ew4YNU2pqKisGgOvmWzWioqI0fvx403GAsMGiASDkVFdX68MPP9TatWvVrVs3jRw5UklJSaZjAbAoh8Oh4uJi/eUvf9GuXbvUuXNn05GAsEDRABBStmzZopkzZ6qurk5jxozRwIEDWTEANFqPHj3UunVrzZs3T506deLPFSAIKBoAQsK5c+f04Ycfat26derevbtGjhypxMRE07EA2IRv1Xjrrbe0e/duVg0gCCgaAIzbtGmTZs2aJY/HozvuuEMDBgzgp40A/K579+5q06YNqwYQJBQNAMacPXtWs2fP1oYNG9SzZ0+NGDFCCQkJpmMBsCnfqvHmm29q165d6tKli+lIgK1RNAAYsWHDBn3wwQfyer2688471a9fP366CCDgunXrprZt22revHnq3Lkzf+4AAUTRABBUZ8+e1QcffKCNGzeqV69eGjFihOLj403HAhAmfM/VePPNN7Vz50517drVdCTAtigaAILC6/VeXDEcDofuuusu9e3bl58mAgi6S1eNLl268OcQECAUDQABV1VVpVmzZmnz5s3q06ePbr/9dsXFxZmOBSBM+c5q/O///q927Nihbt26mY4E2BJFA0DAeL1erVu3TrNnz5bT6dTYsWPVp08f07EAQF27dlW7du00b948de3alVUDCACKBoCAOHPmjGbOnKmtW7eqX79+Gj58uGJjY03HAgBJ/1g13njjDW3fvl3du3c3HQmwHYoGAL/yer1as2aN5syZI5fLpW9/+9vq3bu36VgA8DVdunRR+/btNW/ePHXr1o1VA/AzigYAvzl9+rRmzpypbdu2acCAARo2bBgrBoCQ5Vs1/vznP2vbtm3q0aOH6UiArVA0ADSa1+vV6tWrNWfOHEVEROg73/mOevbsaToWAFxV586d1aFDB5WVlal79+6sGoAfUTQANMqpU6c0Y8YM7dixQwMHDtSwYcMUExNjOhYAXBPfqvH666+zagB+RtEAcEO8Xq9Wrlypjz76SFFRUbr33nv5Ag3Akjp16qSOHTtq3rx5rBqAH1E0AFy3kydP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",
      "text/plain": [
       "<Figure size 1000x1000 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize=(10, 10))\n",
    "\n",
    "kwargs = {'cmap': 'hot', 'node_size': 1500, 'edge_color': 'gray', \n",
    "          'vmin': np.array(results).min(), 'vmax': np.array(results).max()*1.1}\n",
    "\n",
    "def update(idx):\n",
    "    ax.clear()\n",
    "    colors = results[idx]\n",
    "    nx.draw(g, pos, node_color=colors, ax=ax, **kwargs)\n",
    "    ax.set_title(f\"Iter={idx}\", fontsize=20)\n",
    "\n",
    "anim = animation.FuncAnimation(fig, update, frames=len(results), interval=1000, repeat=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "d6eec4f6-e2f7-4519-a638-15d97e4d4331",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-10-28T14:16:31.889127Z",
     "iopub.status.busy": "2024-10-28T14:16:31.888492Z",
     "iopub.status.idle": "2024-10-28T14:16:32.937259Z",
     "shell.execute_reply": "2024-10-28T14:16:32.935875Z",
     "shell.execute_reply.started": "2024-10-28T14:16:31.889082Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<video width=\"1000\" height=\"1000\" controls autoplay loop>\n",
       "  <source type=\"video/mp4\" src=\"data:video/mp4;base64,AAAAHGZ0eXBNNFYgAAACAGlzb21pc28yYXZjMQAAAAhmcmVlAABJL21kYXQAAAKgBgX//5zcRem9\n",
       "5tlIt5Ys2CDZI+7veDI2NCAtIGNvcmUgMTU3IC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENv\n",
       "cHlsZWZ0IDIwMDMtMjAxOCAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9w\n",
       "dGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDExMyBtZT1o\n",
       "ZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0xIG1lX3JhbmdlPTE2\n",
       "IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0\n",
       "X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTMxIGxvb2thaGVhZF90aHJlYWRz\n",
       "PTUgc2xpY2VkX3RocmVhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50ZXJsYWNlZD0wIGJsdXJheV9j\n",
       "b21wYXQ9MCBjb25zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MyBiX3B5cmFtaWQ9MiBiX2FkYXB0\n",
       "PTEgYl9iaWFzPTAgZGlyZWN0PTEgd2VpZ2h0Yj0xIG9wZW5fZ29wPTAgd2VpZ2h0cD0yIGtleWlu\n",
       "dD0yNTAga2V5aW50X21pbj0xIHNjZW5lY3V0PTQwIGludHJhX3JlZnJlc2g9MCByY19sb29rYWhl\n",
       "YWQ9NDAgcmM9Y3JmIG1idHJlZT0xIGNyZj0yMy4wIHFjb21wPTAuNjAgcXBtaW49MCBxcG1heD02\n",
       "OSBxcHN0ZXA9NCBpcF9yYXRpbz0xLjQwIGFxPTE6MS4wMACAAAAdPmWIhAAX//731LfMsu1Tb7YL\n",
       "qPeiniZfQ3UlAZuWxO06gAAAAwAAAwAAAwAAKALwtlxqWAk1rsAAAAMAC6gAagALyAGuxb//hSPY\n",
       "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\n",
       "\">\n",
       "  Your browser does not support the video tag.\n",
       "</video>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "HTML(anim.to_html5_video())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b793666c-1b18-4f5f-a9ec-f552b5c601fc",
   "metadata": {},
   "source": [
    "### two layers GCN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "e9c2f813-a21c-4406-8f8d-1b906b2f3337",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-10-15T16:04:16.500717Z",
     "iopub.status.busy": "2024-10-15T16:04:16.500140Z",
     "iopub.status.idle": "2024-10-15T16:04:16.513518Z",
     "shell.execute_reply": "2024-10-15T16:04:16.511426Z",
     "shell.execute_reply.started": "2024-10-15T16:04:16.500672Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<img src=\"./imgs/two-layers-gcn.png\" width=\"400\"/>"
      ],
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Image(url='./imgs/two-layers-gcn.png', width=400)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bc026e17",
   "metadata": {},
   "source": [
    "## interaction_network"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "be734138",
   "metadata": {},
   "source": [
    "- references\n",
    "    - https://arxiv.org/pdf/1612.00222.pdf：Learning about Objects, Relations and Physics\n",
    "        - 网路结构非常清晰；\n",
    "    - https://github.com/higgsfield/interaction_network_pytorch"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2287adc8-bc14-4cc2-a412-471f50318cdb",
   "metadata": {},
   "source": [
    "### Example"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7525019f-00e1-4db0-9d5f-ccd0689a709a",
   "metadata": {},
   "source": [
    "- https://blog.zakjost.com/post/gcn_citeseer/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "75c0b2e6-8aaa-4ae3-aa89-393ee4f7ba50",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.13"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
